package com.cskaoyan.wordmemorize.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cskaoyan.wordmemorize.converter.LevelConverter;
import com.cskaoyan.wordmemorize.dao.entity.LevelPrivilegeDO;
import com.cskaoyan.wordmemorize.dao.mapper.LevelPrivilegeMapper;
import com.cskaoyan.wordmemorize.dto.admin.DeleteLevelPrivilegeOperateDTO;
import com.cskaoyan.wordmemorize.dto.admin.LevelPrivilegeDTO;
import com.cskaoyan.wordmemorize.dto.admin.PageDTO;
import com.cskaoyan.wordmemorize.request.BatchDeleteCommand;
import com.cskaoyan.wordmemorize.request.LevelPrivilegeCommand;
import com.cskaoyan.wordmemorize.request.LevelPrivilegePageRequest;
import com.cskaoyan.wordmemorize.service.LevelPrivilegeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class LevelPrivilegeServiceImpl implements LevelPrivilegeService {

    @Autowired
    LevelPrivilegeMapper levelPrivilegeMapper;

    @Autowired
    LevelConverter levelConverter;


    // todo 添加等级特权(后台等级权限管理-特权管理)
    @Override
    public void addLevelPrivilege(LevelPrivilegeCommand command) {

        LevelPrivilegeDO levelPrivilegeDO = levelConverter.levelPrivilegeCommandToLevelPrivilegeDO(command);
        levelPrivilegeMapper.insert(levelPrivilegeDO);
    }

    // todo 更新等级特权(后台等级权限管理-特权管理)
    @Override
    public void updateLevelPrivilege(LevelPrivilegeCommand command) {

        LevelPrivilegeDO levelPrivilegeDO = levelConverter.levelPrivilegeCommandToLevelPrivilegeDO(command);

        // 通过id更新，填入DO对象即可
        levelPrivilegeMapper.updateById(levelPrivilegeDO);


//        // 不知道为什么条件构造器没生效，以后处理

//        // 用条件构造器上传更新
//        LambdaUpdateWrapper<LevelPrivilegeDO> myLevelPrivilegeDO_UpdateWrapper = new LambdaUpdateWrapper<>();
//
//        // 用条件构造器锁定要更新的对象
//        myLevelPrivilegeDO_UpdateWrapper.eq(LevelPrivilegeDO::getLevelId,command.getId());
//
//        // 用左边的对象(的非null部分)，覆盖右边的对象
//        levelPrivilegeMapper.update(levelPrivilegeDO,myLevelPrivilegeDO_UpdateWrapper);

    }


    // todo 获取等级特权列表---分页查询(后台等级权限管理-特权管理)
    @Override
    public PageDTO<LevelPrivilegeDTO> getLevelPrivilegeList(LevelPrivilegePageRequest pageRequest) {

        // 创建空的条件构造器，用来全表查询
        LambdaQueryWrapper<LevelPrivilegeDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();


        // todo 没给等级 或 特权码/特权名称, 则全表查询
        if (pageRequest.getLevelId() == null && pageRequest.getKeyword() == null) {

            // 条件构造器没有信息时，为全表查询
            // 封装成List<LevelPrivilegeDO>
            List<LevelPrivilegeDO> levelPrivilegeDOS = levelPrivilegeMapper.selectList(lambdaQueryWrapper);

            // 老师提供好的转化方法，把List<LevelPrivilegeDO>转成PageDTO<LevelPrivilegeDTO>，并返回
            return levelConverter.levelPrivilegeDOToPageDTO(levelPrivilegeDOS, levelPrivilegeDOS.size());
        }


        // todo 有参数则做分页查询

        // 匹配相似的特权名称
        lambdaQueryWrapper.like(LevelPrivilegeDO::getPrivilegeName, pageRequest.getKeyword());


        // 用或，匹配相似的特权码
        lambdaQueryWrapper.or();
        lambdaQueryWrapper.like(LevelPrivilegeDO::getPrivilegeCode, pageRequest.getKeyword());

        // 用或，匹配相等级
        lambdaQueryWrapper.or();
        lambdaQueryWrapper.eq(LevelPrivilegeDO::getLevelId, pageRequest.getLevelId());

        List<LevelPrivilegeDO> levelPrivilegeDOS = levelPrivilegeMapper.selectList(lambdaQueryWrapper);

        return levelConverter.levelPrivilegeDOToPageDTO(levelPrivilegeDOS, levelPrivilegeDOS.size());


//  不用的旧方案
//                                                         //   展现第几页                  每页条数
//        Page<LevelPrivilegeDO> levelPrivilegeDOPage = new Page<>(pageRequest.getPageNum(), pageRequest.getCount());
//
//        // 创建范型条件构造器
//        LambdaQueryWrapper<LevelPrivilegeDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//
//        // todo 检查是否给于关键字参数, 如果有还需加上模糊查询的条件
//
//            // 匹配相似的特权名称
//            lambdaQueryWrapper.like(LevelPrivilegeDO::getPrivilegeName, pageRequest.getKeyword());
//
//            // 匹配相似的特权码
//            lambdaQueryWrapper.like(LevelPrivilegeDO::getPrivilegeCode, pageRequest.getKeyword());
//
//            // 匹配相等级
//            lambdaQueryWrapper.eq(LevelPrivilegeDO::getPrivilegeCode, pageRequest.getKeyword());
//
//        // 第一页
//        Page<LevelPrivilegeDO> levelPrivilegeDOPage1 = levelPrivilegeMapper.selectPage(levelPrivilegeDOPage, lambdaQueryWrapper);
//        // 先把long转成int ，再转成Integer，被逼的
//        return levelConverter.levelPrivilegeDOToPageDTO(levelPrivilegeDOPage1.getRecords(), Integer.bitCount((int) levelPrivilegeDOPage1.getTotal()));


    }


    // 删除等级特权(后台等级权限管理-特权管理)
    @Override
    public DeleteLevelPrivilegeOperateDTO deleteLevelPrivilege(Long id) {


//        // 简单做法
//        // 只有传了一个id进来，所以直接通过id删掉
//        levelPrivilegeMapper.deleteById(id);
//        return null;


        // 综合做法
        // 先通过id找到DO实体
        LevelPrivilegeDO levelPrivilegeDO = levelPrivilegeMapper.selectById(id);
        // 然后再通过ID删除
        levelPrivilegeMapper.deleteById(levelPrivilegeDO);

        // 把DO转化成DTO并返回
        DeleteLevelPrivilegeOperateDTO deleteLevelPrivilegeOperateDTO = levelConverter.levelPrivilegeDOToDeleteLevelPrivilegeOperateDTO(levelPrivilegeDO);
        return deleteLevelPrivilegeOperateDTO;
    }


    // todo 批量删除更新等级特权(后台等级权限管理-特权管理)
    @Override
    public List<DeleteLevelPrivilegeOperateDTO> batchDeleteLevelPrivilege(BatchDeleteCommand command) {


        List<DeleteLevelPrivilegeOperateDTO> deleteLevelPrivilegeOperateDTOS = new ArrayList<>();


        // 从json字符串command中，获得Ids数组
        // 把Ids数组的字符串逐条执行
        for (String id : command.getIds()) {
            // 反复调用单条删除方法 deleteLevelPrivilege
            DeleteLevelPrivilegeOperateDTO deleteGoodsOperateDTO = deleteLevelPrivilege(Long.valueOf(id));

            // 把各个DTO添加到数组deleteLevelPrivilegeOperateDTOS
            deleteLevelPrivilegeOperateDTOS.add(deleteGoodsOperateDTO);
        }
        return deleteLevelPrivilegeOperateDTOS;


    }
}
